Skip to content

fix(coding-agent): 修复 dsh 补丁 YAML 缩进丢失并让失败原因可见 - #1205

Merged
H-Chris233 merged 1 commit into
Open-Less:betafrom
xnqycs:fix/dsh-patch-yaml-indent
Oct 19, 2026
Merged

H-Chris233 merged 1 commit into
Open-Less:betafrom
xnqycs:fix/dsh-patch-yaml-indent

Conversation

@xnqycs

@xnqycs xnqycs commented Oct 15, 2026

Copy link
Copy Markdown
Contributor

摘要

Fixes #1204。

修复 Less Computer 选择 dsh 后端时必然失败的问题:build_dsh_patch_yaml 生成的 openless.patch.yml 缩进全部丢失,是非法 YAML,dsh 解析时崩溃;同时让这类失败在界面上显示真实原因,而不是只显示 Node.js v24.18.1。

修复 / 新增 / 改进

  • build_dsh_patch_yaml:不再用行尾 \ 续行拼接(Rust 会吃掉下一行开头的空白),改用 concat! 逐行拼接,缩进得以保留。
  • summarize_stderr:对 error: 的匹配改为不区分大小写,使 Node 崩溃输出里的 Error: dsh: failed to parse ... 能被选中,而不是回退到最后一行的 Node 版本号。
  • 新增 3 个单元测试:
    • dsh_patch_yaml_keeps_its_indentation:逐字断言生成的补丁文本(含缩进、Windows 反斜杠路径、换行和引号)。
    • summarize_stderr_picks_the_node_crash_message_not_the_version_footer:用真实的 dsh 崩溃 stderr 断言摘要。
    • summarize_stderr_falls_back_to_the_last_line:无匹配行时仍回退到最后一行,空输入返回 None。

兼容

测试计划

  • 命令:cargo test --locked -p openless-core --lib -- summarize_stderr dsh_patch_yaml
  • 结果:3 个新增测试通过;修复前同样的测试失败(YAML 测试输出的正是无缩进文件,stderr 测试返回 Node.js v24.18.1)。coding_agent 模块 37 个测试全部通过。
  • 命令:fork 上手动触发 ci.yml(workflow_dispatch)
  • 结果:Windows、macOS、macOS MSRV 1.88、Android cargo check、Linux Core/egui/deb/rpm、UI motion 全部通过(该次运行基于 rebase 前的提交,内容与上游新增的发版提交互不相关)。
  • 证据路径:https://github.com/xnqycs/openless/actions/runs/38794452727
  • 端到端手动验证:用 OpenLess 同样的参数、环境变量和 Windows 启动方式(挂起启动 + Job Object + 管道 stdio)调用 DeepSeek Harness Desktop 的 dsh 0.2.0-rc.2,补丁文件缩进正确时正常返回,缩进丢失的版本报 YAMLException 且与 issue 中一致。未编译运行完整桌面应用。

build_dsh_patch_yaml 用行尾 `\` 续行拼接 YAML,Rust 会吃掉续行后的前导空白,
生成的 openless.patch.yml 没有任何缩进,是非法 YAML。dsh 解析补丁失败后崩溃,
Less Computer 选择 dsh 后端时每次都失败。

summarize_stderr 只取以 `dsh:` 开头或含小写 `error:` 的行,而 Node 崩溃输出是
`Error: dsh: failed to parse ...`,匹配不上就回退到最后一行,界面上只剩
`Node.js v24.18.1`,看不到真实原因。

- build_dsh_patch_yaml 改用 concat! 逐行拼接,保留缩进
- summarize_stderr 对 `error:` 的匹配不再区分大小写
- 新增测试:补丁 YAML 逐字输出(含 Windows 反斜杠路径、换行、引号)、
  Node 崩溃 stderr 的摘要、无匹配行时回退到最后一行
@H-Chris233

Copy link
Copy Markdown
Collaborator

开始审查

@H-Chris233 H-Chris233 self-assigned this Oct 19, 2026
@H-Chris233
H-Chris233 merged commit 0047791 into Open-Less:beta Oct 19, 2026
7 checks passed
aeoform added a commit to aeoform/openless that referenced this pull request Oct 19, 2026
并入 origin/beta 剩下的 10 个上游 commit(此前分支已合过前 4 个):

- Windows:TSF 组字听写输入(Open-Less#1189)、明文插入模式开关(Open-Less#1182)、
  胶囊显示目标模式(Open-Less#1232)
- Android:arm64 本地 ASR + 云回退/自动切换(Open-Less#1231)、本地配置迁移(Open-Less#1199)、
  草稿条(Open-Less#1187)、悬浮层「永不显示」(Open-Less#1221)、英文键盘上滑符号重排(Open-Less#1188)
- 发布:稳定版直链别名(Open-Less#1198)
- coding-agent:dsh 补丁 YAML 缩进修复(Open-Less#1205)

代码层面零冲突,但本仓较新的依赖版本让上游新代码编译不过,手工收口两处
(都只在 Android 本地迁移包路径上):

1. `zip` 9 vs 2.x —— `ZipFile::name()` 现在返回 `Result<Cow<str>, ZipError>`:
   `.map_err(|_| BundleError::MalformedContainer)?.into_owned()`。
2. `cipher` 0.5(`aes` 钉 0.9.2 带来的版本)把 `XNonce::from_slice` 标成
   deprecated:改用 `&[u8; NONCE_BYTES] -> &XNonce` 的转换。

验证:core 与 linux-egui 全量测试通过、clippy `-D warnings` 干净、egui 四个
JS 契约测试通过、i18n 0 added/0 updated、deb/rpm 打包 + 校验通过
(2.0.2-Beta.1-137)。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[windows][less-computer][dsh] Windows 上 dsh 后端必然失败:生成的 openless.patch.yml 缩进丢失,界面只显示 Node 版本号

2 participants